package br.com.dev.tcc.view.sinistro;

import java.util.ArrayList;
import java.util.List;
import java.util.Vector;

import android.os.AsyncTask;
import android.os.Bundle;
import android.widget.Toast;
import br.com.dev.tcc.R;
import br.com.dev.tcc.bean.ResponseData;
import br.com.dev.tcc.bean.sinistro.Condutor;
import br.com.dev.tcc.bean.sinistro.GravidadeAcidente;
import br.com.dev.tcc.bean.sinistro.NivelAgua;
import br.com.dev.tcc.bean.sinistro.ParteAvariadasEnum;
import br.com.dev.tcc.bean.sinistro.Sinistro;
import br.com.dev.tcc.bean.sinistro.Terceiro;
import br.com.dev.tcc.bean.sinistro.TipoSinistro;
import br.com.dev.tcc.bean.sinistro.Vitima;
import br.com.dev.tcc.connection.SinistroWrapperWS;
import br.com.dev.tcc.connection.WSClient;
import br.com.dev.tcc.model.SinistroModel;
import br.com.dev.tcc.singleton.SinistroSingleton;
import br.com.dev.tcc.view.DefaultSupportActionBarActivity;
import br.com.dev.tcc.view.dialog.EnviaSinistroDialog;
import br.com.dev.tcc.view.dialog.EnviaSinistroDialog.OnConfirmListener;
import br.com.dev.tcc.view.dialog.ErrorDialog;
import br.com.dev.tcc.view.dialog.ProgressCustomDialog;
import br.com.dev.tcc.view.sinistro.chain.SinistroChain;
import br.com.dev.tcc.view.sinistro.chain.SinistroChain.OnCancelListener;
import br.com.dev.tcc.view.sinistro.chain.SinistroChain.OnFinishListener;
import br.com.dev.tcc.view.sinistro.chain.atropelamento.SinistroChainAtropelamento;
import br.com.dev.tcc.view.sinistro.chain.colisao.SinistroChainColisao;
import br.com.dev.tcc.view.sinistro.chain.enchente.SinistroChainEnchente;
import br.com.dev.tcc.view.sinistro.chain.incendio.SinistroChainIncendio;
import br.com.dev.tcc.view.sinistro.chain.roubo.SinistroChainRoubo;
import br.com.dev.tcc.view.sinistro.chain.vidro.SinistroChainVidro;

public class AbrirSinistroActivity extends DefaultSupportActionBarActivity {

	private SinistroModel model;
	private SinistroChain chain;

	@Override
	protected void onCreate(Bundle savedInstanceState) {

		super.onCreate(null);
		setContentView(R.layout.sinistro_chain);

		TipoSinistro tipoSinistro = SinistroSingleton.getInstance().getTipo();

		if(tipoSinistro != null){
		
			setActionBar(R.string.sinistro, getSubtitulo(tipoSinistro),
					R.drawable.sinistro);
	
			SinistroSingleton.flushInstance();
			SinistroSingleton.getInstance().setTipoDescricao(
					tipoSinistro.getDescricao(this));
			chain = getChain(tipoSinistro);
			chain.setOnCancelListener(new OnCancelListener() {
				@Override
				public void onCancel() {
					finish();
				}
			});
			chain.setOnFinishListener(new OnFinishListener() {
				@Override
				public void onFinish() {
					new EnviaSinistroDialog(AbrirSinistroActivity.this,
							SinistroSingleton.getInstance(),
							new OnConfirmListener() {
	
								@Override
								public void onConfirm() {
									enviaSinistro();
								}
							}).show();
				}
			});
		}
		else{
			finish();
		}
	}

	private int getSubtitulo(TipoSinistro tipoSinistro) {

		switch (tipoSinistro) {

		case COLISAO:
			return R.string.ocorrencia_colisao;
		case INCENDIO:
			return R.string.ocorrencia_incendio;
		case ROUBO_FURTO:
			return R.string.ocorrencia_roubo;
		case ATROPELAMENTO:
			return R.string.ocorrencia_atropelamento;
		case ENCHENTE:
			return R.string.ocorrencia_enchente;
		case VIDRO:
			return R.string.ocorrencia_vidro;
		default:
			return -1;
		}
	}

	private SinistroChain getChain(TipoSinistro tipo) {

		if (tipo.equals(TipoSinistro.COLISAO))
			return new SinistroChainColisao(this);

		if (tipo.equals(TipoSinistro.INCENDIO))
			return new SinistroChainIncendio(this);

		if (tipo.equals(TipoSinistro.ROUBO_FURTO))
			return new SinistroChainRoubo(this);

		if (tipo.equals(TipoSinistro.ATROPELAMENTO))
			return new SinistroChainAtropelamento(this);

		if (tipo.equals(TipoSinistro.ENCHENTE))
			return new SinistroChainEnchente(this);

		if (tipo.equals(TipoSinistro.VIDRO))
			return new SinistroChainVidro(this);

		return null;
	}

	private void enviaSinistro() {

		final ProgressCustomDialog dialog = new ProgressCustomDialog(this);
		dialog.setMessage(R.string.enviando);
		dialog.setCancelable(false);
		dialog.show();

		new AsyncTask<Void, Void, ResponseData<Sinistro>>() {

			@Override
			protected ResponseData<Sinistro> doInBackground(Void... params) {

				Sinistro sinistro = SinistroSingleton.getInstance();
				WSClient client = new WSClient();
				SinistroWrapperWS wrapper = new SinistroWrapperWS();

				wrapper.setIdApolice(sinistro.getApolice().getId());
				wrapper.setTipo(sinistro.getTipo().getCode());
				wrapper.setTipoDescricao(sinistro.getTipoDescricao());
				wrapper.setData(sinistro.getData());

				Condutor condutor = sinistro.getCondutor();
				if (condutor != null) {
					wrapper.setCondutor(condutor.getCode());
					if (condutor.equals(Condutor.DEPENDENTE))
						wrapper.setCpfDependente(getCpfFormatado(sinistro
								.getDependente().getCpf()));
					else if (condutor.equals(Condutor.TERCEIRO)) {
						Terceiro terceiro = sinistro.getTerceiro();
						wrapper.setNomeTerceiro(terceiro.getNome());
						wrapper.setCpfTerceiro(getCpfFormatado(terceiro
								.getCpf()));
						wrapper.setEmailTerceiro(terceiro.getEmail());
						wrapper.setTelefoneTerceiro(terceiro.getTelefone());
					}
				} else
					wrapper.setCondutor(Condutor.SEGURADO.getCode());

				wrapper.setDescritivo(sinistro.getDescritivo());
				wrapper.setResponsavel(sinistro.getResponsavel());
				wrapper.setLocal(sinistro.getLocal());
				wrapper.setTipoDescricao(sinistro.getTipoDescricao());
				wrapper.setEstavaNoVeiculo(sinistro.getEstavaNoVeiculo());
				wrapper.setDentroDeEstabelecimento(sinistro
						.getDentroDeEstabelecimento());
				wrapper.setBo(sinistro.getBo());
				wrapper.setAlguemSeMachucou(sinistro.getAlguemSeMachucou());
				GravidadeAcidente gravidade = sinistro.getGravidadeAcidente();
				if (gravidade != null)
					wrapper.setGravidadeAcidente(gravidade.getDescricao());
				wrapper.setInternacaoOuResgate(sinistro
						.getInternacaoOuResgate());
				NivelAgua nivel = sinistro.getNivelAgua();
				if (nivel != null)
					wrapper.setNivelAgua(nivel.getDescricao());
				wrapper.setPertoDeRio(sinistro.getPertoDeRio());

				Vitima vitima = sinistro.getVitima();
				if (vitima != null) {
					wrapper.setCpfVitima(getCpfFormatado(vitima.getCpf()));
					wrapper.setNomeVitima(vitima.getNome());
					wrapper.setTelefoneVitima(vitima.getTelefone());
					wrapper.setVitimaAssumiuResponsabilidade(sinistro
							.getVitimaAssumiuResponsabilidade());
				}

				Vector<String> partesAvariadas = new Vector<String>();
				List<ParteAvariadasEnum> partes = sinistro.getPartesAvariadas();
				if (partes == null)
					partes = new ArrayList<ParteAvariadasEnum>();
				for (ParteAvariadasEnum parte : partes) {
					partesAvariadas.add(parte.getId());
				}

				ResponseData<Sinistro> result = client.inserirSinistro(
						AbrirSinistroActivity.this, wrapper, partesAvariadas);

				if (result.isSuccess()) {

					publishProgress();

					Sinistro instance = SinistroSingleton.getInstance();
					instance.setId(result.getData().getId());
					instance.setStatusMensagem(result.getData()
							.getStatusMensagem());
					instance.setStatus(getResources().getString(
							R.string.status_default));
					
					model = new SinistroModel(AbrirSinistroActivity.this);
					result.setSuccess(model.salva(sinistro));
				}

				return result;
			}

			@Override
			protected void onPostExecute(ResponseData<Sinistro> result) {

				dialog.dismiss();
				if (result.isSuccess()){
					Toast.makeText(AbrirSinistroActivity.this, R.string.sinistro_solicitado, 
							Toast.LENGTH_SHORT).show();
					finish();
				}

				else {
					ErrorDialog errorDialog = new ErrorDialog(
							AbrirSinistroActivity.this,
							result.getErrorMessage());

					errorDialog.show();
				}
			};

			@Override
			protected void onProgressUpdate(Void... value) {

				dialog.setMessage(R.string.registrando);
			};

		}.execute();
	}

	private String getCpfFormatado(String cpf) {
		if (cpf.length() == 11) {
			StringBuilder b = new StringBuilder();
			b.append(cpf.substring(0, 3));
			b.append(".");
			b.append(cpf.substring(3, 6));
			b.append(".");
			b.append(cpf.substring(6, 9));
			b.append("-");
			b.append(cpf.substring(9, 11));

			cpf = b.toString();
		}
		return cpf;
	}
}
